// 钩子函数（Hook Functions）详解
// 钩子函数是一种设计模式中的概念，它是在特定事件发生时被调用的函数，允许你在不修改原始代码的情况下扩展或自定义程序的行为。
// 为可能需要的操作预留一个接口，如果需要的话就在派生类中实现这个虚函数
// 钩子函数的特点
//      1.可选实现：通常在基类中提供默认的空实现或基本实现，派生类可以选择性地重写
//      2.特定时机调用：在算法或流程的特定点被调用
//      3.行为扩展点：提供一种机制让派生类在不改变整体流程的情况下插入自定义行为

// 在NVI模式中的应用
// 在NVI（非虚接口）模式中，钩子函数通常是保护级别的虚函数，它们在主要流程的特定点被调用。例如：
class Base
{
public:
    // 非虚接口
    void process()
    {
        // 前置处理
        beforeProcess(); // 钩子函数 - 在主处理前调用

        // 核心处理
        doProcess(); // 必须由派生类实现的虚函数

        // 后置处理
        afterProcess(); // 钩子函数 - 在主处理后调用
    }

protected:
    // 必须实现的虚函数
    virtual void doProcess() = 0;

    // 钩子函数 - 提供默认实现，派生类可选择性重写
    virtual void beforeProcess()
    {
        // 默认为空或基本实现
    }

    virtual void afterProcess()
    {
        // 默认为空或基本实现
    }
};
